/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package powierzchnie1;

import java.awt.Color;
import java.util.ArrayList;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3d;
import nor.TPoint;

/**
 *
 * @author Arek
 */
public class ZbiorPunktow implements Comparable<ZbiorPunktow> {

    double maxDopuszczalnaOdleglosc = 0.2; //metry
    double maxDopuszczalnyKat = 0.1; //radiany
    Vector3d vSredni = new Vector3d(0, 0, 0);
    Vector3d vSredniSUMA = new Vector3d(0, 0, 0);
    ArrayList<TPoint> punkty = null;

    public ZbiorPunktow(TPoint p){
       this.punkty = new ArrayList<nor.TPoint>();
       this.punkty.add(p);
    }
    public int compareTo(ZbiorPunktow o) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    boolean dodac(TPoint P) throws PunktZerowyException, ZerowyWektorNormalnyException {

        if (P.x == 0 && P.y == 0 && P.z == 0)
            throw new PunktZerowyException();
        Vector3d vNormalny = P.getNorVec();
        if (vNormalny.length() == 0)
            throw new ZerowyWektorNormalnyException();

        //sprawdzamy czy jest wystarczajaco blisko
        //sprawdzamy czy kat nie odstaje od sredniej
        if (this.blizejNiz(P, this.maxDopuszczalnaOdleglosc) &&
                vSredniSUMA.angle(vNormalny) < this.maxDopuszczalnyKat){
            this.punkty.add(P);
            this.vSredniSUMA.add(P);
            //this.obliczNowyWektorSredni();
            return true;
        }
        return false;

    }//koniec dodac(...)

    ArrayList<nor.TPoint> getAL() {
        return this.punkty;
    }
    void setColor(Color kObsz) {
                for(TPoint p : this.punkty)
            p.setColor(kObsz);
    }
    

    int size() {
       return this.punkty.size();
    }
    private boolean blizejNiz(TPoint P, double maxDopuszczalnaOdleglosc) {
        for (TPoint p : this.punkty) {
            if (p.distance(P) < maxDopuszczalnaOdleglosc)
                return true;
        }
        return false;
    }

    
    private void obliczNowyWektorSredni() {
       int liczbaElementow = this.punkty.size() - 1;
       TPoint ostatni = this.punkty.get( this.punkty.size()-1 );
        System.out.println("PRZED: "+ this.vSredni);
       this.vSredni.scale(liczbaElementow);
       System.out.println("PO: " + this.vSredni);
       this.vSredni.add(ostatni);
       this.vSredni.scale( 1/(liczbaElementow+1) );
       
    }
}//koniec klasy ZbiorPunktow




